home *** CD-ROM | disk | FTP | other *** search
/ MIDICraft's MIDINET CD-ROM / MIDICraft's MIDINET CD-ROM.iso / DOSUTILS / KORG / TIMER.BAK < prev    next >
Text File  |  1996-11-02  |  1KB  |  77 lines

  1. #include "timer.hpp"
  2. #include <assert.h>
  3. #include <dos.h>
  4.  
  5. #pragma option -N-
  6.  
  7. Timer* timer = 0;
  8.  
  9. #ifdef __cplusplus
  10.     #define __CPPARGS ...
  11. #else
  12.     #define __CPPARGS
  13. #endif
  14.  
  15. void interrupt ( *oldtimer)(__CPPARGS);
  16.  
  17. #define INT_TIMER   8
  18.  
  19. #pragma warn -eas
  20.  
  21. void interrupt timeinterrupt(__CPPARGS)
  22. {
  23.    if (timer)
  24.      timer->ontime();
  25.    oldtimer();
  26. }
  27.  
  28. #pragma warn .eas
  29.  
  30. Timer::Timer()
  31. {
  32.   timer = 0;
  33.   curtime_ = 0;
  34.   setspeed(SPEED_DEFAULT);
  35.   oldtimer = getvect(INT_TIMER);
  36.   setvect(INT_TIMER, timeinterrupt);
  37.   timer = this;
  38. }
  39.  
  40. Timer::~Timer()
  41. {
  42.   timer = 0;
  43.   setspeed(SPEED_DEFAULT);
  44.   setvect(INT_TIMER, oldtimer);
  45. }
  46.  
  47.  
  48. void Timer::ontime()
  49. {
  50.   curtime_++;
  51. }
  52.  
  53. unsigned Timer::setspeed(unsigned speed)
  54. {
  55.   if (speed < SPEED_MILLISEC)
  56.     speed = SPEED_MILLISEC;
  57.   disable();
  58.   asm mov al,36h
  59.   asm out 43h,al
  60.   asm mov ax, speed
  61.   asm out 40h, al
  62.   asm mov al,ah
  63.   asm out 40h, al
  64.   enable();
  65.   return speed;
  66. }
  67.  
  68. // times interrupts in millisec
  69. unsigned Timer::setspeed(unsigned millisec, unsigned times)
  70. {
  71.   long speed = 0x123456L * millisec / (1000 * times);
  72.   if (speed >= 0x10000)
  73.     speed = 0xffff;
  74.   return setspeed(speed);
  75. }
  76.  
  77.